package org.chnxi.study.leetcode.questions50.ques29;

/**
 * 使用循环减法进行收集结果，在减法过程中，每次将除数叠加，减少循环过程
 *
 * 执行用时：1 ms, 在所有 Java 提交中击败了100.00%的用户
 * 内存消耗：36.9 MB, 在所有 Java 提交中击败了7.69%的用户
 */
public class Simple02 {
    public static void main(String[] args) {

        System.out.println(divide(10 , 3));

        System.out.println(divide(10 , -3));

        System.out.println(divide(-10 , 3));

        System.out.println(divide(Integer.MIN_VALUE , 2));

        System.out.println(divide(Integer.MAX_VALUE , 3));

    }

    public static int divide(int dividend, int divisor) {
        //防止int类型越界
        if(dividend == Integer.MIN_VALUE && divisor == -1){
            return Integer.MAX_VALUE;
        }

        if(divisor == 1){  //处理除数为1的情况
            return dividend;
        }else if(divisor == -1){  //处理除数为-1的情况
            return -dividend;
        }

        //转为负数处理，防止int类型越界
        int num1 = dividend > 0 ? -dividend : dividend;
        int num2 = divisor > 0 ? -divisor : divisor;

        //计算符号位
        int sign = 1;
        if((dividend>0 && divisor<0) || (dividend<0 && divisor>0)){
            sign = -1;
        }

        //针对0和-1，1三种结果进行处理
        if(num1 > num2){
            return 0;
        }else if(num1 == num2){
            return sign;
        }

        int r = mydived(num1 , num2);

        return sign == -1 ? -r : r;
    }

    /**
     * 使用递归的方式进行计算，在计算和判断过程中需要注意num1和num2均为负数
     * @param num1 被除数，之前已经将被除数转为负数
     * @param num2 除数，之前已经将除数转为负数
     * @return
     */
    public static int mydived(int num1 , int num2){
        //如果num1 > num2 , 则无法进行计算
        if(num1 > num2){
            return 0;
        }

        int count = 1;
        int tmpNum2 = num2;


        //tmpNum2+tmpNum2 > num1 此种方式会导致tmpNum2 + tmpNum2越界，越界后大于num1，从而导致结算错误
        while (num1 - tmpNum2 < tmpNum2){
            count += count;
            tmpNum2 += tmpNum2;
        }
        //将num1剩余部分，使用递归再次进行计算
        return count + divide(num1-tmpNum2 , num2);

    }
}
